// bind 方法会创建一个新的函数，在 bind() 被调用时，这个新函数的 this 被指定为 bind() 的第一个参数，而其余参数将作为新函数的参数，供调用时使用。

// 实现要点：

// bind() 除了 this 外，还可传入多个参数；
// bing 创建的新函数可能传入多个参数；
// 新函数可能被当做构造函数调用；
// 函数可能有返回值；
Function.prototype.myBind = function (context) {
  context = context || window
  let args = [...arguments].slice(1)
  let self = this
  return function () {
    return self.apply(context, args)
  }
}

function test (a, b, c) {
  console.log(a, b, c);
  console.log(this.name);
  return '我是方现伟'
}
let obj = {
  name: '阿莫'
}
let boundTest = test.bind(obj, 1, 2, 3)
boundTest()

Function.prototype.MyBind = function (context) {
  // if (typeof this !== 'function') {
  //   throw new TypeError('this should be a function')
  // }
  // context = context || window
  // let args = [...arguments].slice(1)
  // let self = this
  // return function () {
  //   self.apply(context, args)
  // }
  context = context || window
  let args = [...arguments].slice(1)
  context.fn = this
  return function () {
    return context.fn(...args)
  }
}
let myBoundTest = test.MyBind(obj, 1, 2, 3)
myBoundTest()
